home *** CD-ROM | disk | FTP | other *** search
- package koala.dynamicjava.interpreter;
-
- import java.lang.reflect.Array;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Iterator;
- import java.util.List;
- import java.util.ListIterator;
- import java.util.Set;
- import koala.dynamicjava.interpreter.context.Context;
- import koala.dynamicjava.interpreter.context.GlobalContext;
- import koala.dynamicjava.interpreter.error.CatchedExceptionError;
- import koala.dynamicjava.interpreter.error.ExecutionError;
- import koala.dynamicjava.interpreter.modifier.LeftHandSideModifier;
- import koala.dynamicjava.interpreter.throwable.BreakException;
- import koala.dynamicjava.interpreter.throwable.ContinueException;
- import koala.dynamicjava.interpreter.throwable.ReturnException;
- import koala.dynamicjava.interpreter.throwable.ThrownException;
- import koala.dynamicjava.tree.AddAssignExpression;
- import koala.dynamicjava.tree.AddExpression;
- import koala.dynamicjava.tree.AndExpression;
- import koala.dynamicjava.tree.ArrayAccess;
- import koala.dynamicjava.tree.ArrayAllocation;
- import koala.dynamicjava.tree.ArrayInitializer;
- import koala.dynamicjava.tree.BitAndAssignExpression;
- import koala.dynamicjava.tree.BitAndExpression;
- import koala.dynamicjava.tree.BitOrAssignExpression;
- import koala.dynamicjava.tree.BitOrExpression;
- import koala.dynamicjava.tree.BlockStatement;
- import koala.dynamicjava.tree.BreakStatement;
- import koala.dynamicjava.tree.CastExpression;
- import koala.dynamicjava.tree.CatchStatement;
- import koala.dynamicjava.tree.ClassAllocation;
- import koala.dynamicjava.tree.ComplementExpression;
- import koala.dynamicjava.tree.ConditionalExpression;
- import koala.dynamicjava.tree.ContinueStatement;
- import koala.dynamicjava.tree.DivideAssignExpression;
- import koala.dynamicjava.tree.DivideExpression;
- import koala.dynamicjava.tree.DoStatement;
- import koala.dynamicjava.tree.EqualExpression;
- import koala.dynamicjava.tree.ExclusiveOrAssignExpression;
- import koala.dynamicjava.tree.ExclusiveOrExpression;
- import koala.dynamicjava.tree.Expression;
- import koala.dynamicjava.tree.ForStatement;
- import koala.dynamicjava.tree.FormalParameter;
- import koala.dynamicjava.tree.FunctionCall;
- import koala.dynamicjava.tree.GreaterExpression;
- import koala.dynamicjava.tree.GreaterOrEqualExpression;
- import koala.dynamicjava.tree.IfThenElseStatement;
- import koala.dynamicjava.tree.IfThenStatement;
- import koala.dynamicjava.tree.InnerAllocation;
- import koala.dynamicjava.tree.InstanceOfExpression;
- import koala.dynamicjava.tree.LabeledStatement;
- import koala.dynamicjava.tree.LessExpression;
- import koala.dynamicjava.tree.LessOrEqualExpression;
- import koala.dynamicjava.tree.Literal;
- import koala.dynamicjava.tree.MethodDeclaration;
- import koala.dynamicjava.tree.MinusExpression;
- import koala.dynamicjava.tree.MultiplyAssignExpression;
- import koala.dynamicjava.tree.MultiplyExpression;
- import koala.dynamicjava.tree.Node;
- import koala.dynamicjava.tree.NotEqualExpression;
- import koala.dynamicjava.tree.NotExpression;
- import koala.dynamicjava.tree.ObjectFieldAccess;
- import koala.dynamicjava.tree.ObjectMethodCall;
- import koala.dynamicjava.tree.OrExpression;
- import koala.dynamicjava.tree.PlusExpression;
- import koala.dynamicjava.tree.PostDecrement;
- import koala.dynamicjava.tree.PostIncrement;
- import koala.dynamicjava.tree.PreDecrement;
- import koala.dynamicjava.tree.PreIncrement;
- import koala.dynamicjava.tree.QualifiedName;
- import koala.dynamicjava.tree.RemainderAssignExpression;
- import koala.dynamicjava.tree.RemainderExpression;
- import koala.dynamicjava.tree.ReturnStatement;
- import koala.dynamicjava.tree.ShiftLeftAssignExpression;
- import koala.dynamicjava.tree.ShiftLeftExpression;
- import koala.dynamicjava.tree.ShiftRightAssignExpression;
- import koala.dynamicjava.tree.ShiftRightExpression;
- import koala.dynamicjava.tree.SimpleAllocation;
- import koala.dynamicjava.tree.SimpleAssignExpression;
- import koala.dynamicjava.tree.StaticFieldAccess;
- import koala.dynamicjava.tree.StaticMethodCall;
- import koala.dynamicjava.tree.SubtractAssignExpression;
- import koala.dynamicjava.tree.SubtractExpression;
- import koala.dynamicjava.tree.SuperFieldAccess;
- import koala.dynamicjava.tree.SuperMethodCall;
- import koala.dynamicjava.tree.SwitchBlock;
- import koala.dynamicjava.tree.SwitchStatement;
- import koala.dynamicjava.tree.SynchronizedStatement;
- import koala.dynamicjava.tree.ThrowStatement;
- import koala.dynamicjava.tree.TryStatement;
- import koala.dynamicjava.tree.TypeExpression;
- import koala.dynamicjava.tree.UnsignedShiftRightAssignExpression;
- import koala.dynamicjava.tree.UnsignedShiftRightExpression;
- import koala.dynamicjava.tree.VariableDeclaration;
- import koala.dynamicjava.tree.WhileStatement;
- import koala.dynamicjava.tree.visitor.VisitorObject;
- import koala.dynamicjava.util.Constants;
- import koala.dynamicjava.util.ImportationManager;
-
- public class EvaluationVisitor extends VisitorObject {
- private Context context;
- // $FF: synthetic field
- private static Class class$Ljava$lang$Character;
-
- public Object visit(WhileStatement var1) {
- try {
- while((Boolean)var1.getCondition().acceptVisitor(this)) {
- try {
- var1.getBody().acceptVisitor(this);
- } catch (ContinueException var3) {
- if (var3.isLabeled() && !var1.hasLabel(var3.getLabel())) {
- throw var3;
- }
- }
- }
- } catch (BreakException var4) {
- if (var4.isLabeled() && !var1.hasLabel(var4.getLabel())) {
- throw var4;
- }
- }
-
- return null;
- }
-
- public Object visit(ForStatement var1) {
- try {
- Set var5 = (Set)var1.getProperty("variables");
- this.context.enterScope(var5);
- if (var1.getInitialization() != null) {
- Iterator var6 = var1.getInitialization().iterator();
-
- while(var6.hasNext()) {
- ((Node)var6.next()).acceptVisitor(this);
- }
- }
-
- try {
- Expression var15 = var1.getCondition();
- List var7 = var1.getUpdate();
-
- while(var15 == null || (Boolean)var15.acceptVisitor(this)) {
- try {
- var1.getBody().acceptVisitor(this);
- } catch (ContinueException var12) {
- if (var12.isLabeled() && !var1.hasLabel(var12.getLabel())) {
- throw var12;
- }
- }
-
- if (var7 != null) {
- Iterator var8 = var7.iterator();
-
- while(var8.hasNext()) {
- ((Node)var8.next()).acceptVisitor(this);
- }
- }
- }
- } catch (BreakException var13) {
- if (var13.isLabeled() && !var1.hasLabel(var13.getLabel())) {
- throw var13;
- }
- }
- } finally {
- this.context.leaveScope();
- }
-
- return null;
- }
-
- public Object visit(DoStatement var1) {
- while(true) {
- try {
- try {
- var1.getBody().acceptVisitor(this);
- } catch (ContinueException var3) {
- if (var3.isLabeled() && !var1.hasLabel(var3.getLabel())) {
- throw var3;
- }
- }
-
- if ((Boolean)var1.getCondition().acceptVisitor(this)) {
- continue;
- }
- } catch (BreakException var4) {
- if (var4.isLabeled() && !var1.hasLabel(var4.getLabel())) {
- throw var4;
- }
- }
-
- return null;
- }
- }
-
- public Object visit(SwitchStatement var1) {
- try {
- boolean var2 = false;
- Object var3 = var1.getSelector().acceptVisitor(this);
- if (var3 instanceof Character) {
- var3 = new Integer((Character)var3);
- }
-
- Number var4 = (Number)var3;
- ListIterator var5 = var1.getBindings().listIterator();
- ListIterator var6 = null;
-
- label65:
- while(var5.hasNext()) {
- SwitchBlock var7 = (SwitchBlock)var5.next();
- Number var8 = null;
- if (var7.getExpression() != null) {
- var3 = var7.getExpression().acceptVisitor(this);
- if (var3 instanceof Character) {
- var3 = new Integer((Character)var3);
- }
-
- var8 = (Number)var3;
- } else {
- var6 = var1.getBindings().listIterator(var5.nextIndex() - 1);
- }
-
- if (var8 != null && var4.intValue() == var8.intValue()) {
- var2 = true;
-
- while(true) {
- if (var7.getStatements() != null) {
- Iterator var9 = var7.getStatements().iterator();
-
- while(var9.hasNext()) {
- ((Node)var9.next()).acceptVisitor(this);
- }
- }
-
- if (!var5.hasNext()) {
- break label65;
- }
-
- var7 = (SwitchBlock)var5.next();
- }
- }
- }
-
- if (!var2 && var6 != null) {
- SwitchBlock var12 = (SwitchBlock)var6.next();
-
- while(true) {
- if (var12.getStatements() != null) {
- Iterator var13 = var12.getStatements().iterator();
-
- while(var13.hasNext()) {
- ((Node)var13.next()).acceptVisitor(this);
- }
- }
-
- if (!var6.hasNext()) {
- break;
- }
-
- var12 = (SwitchBlock)var6.next();
- }
- }
- } catch (BreakException var10) {
- if (var10.isLabeled()) {
- throw var10;
- }
- }
-
- return null;
- }
-
- public Object visit(LabeledStatement var1) {
- try {
- var1.getStatement().acceptVisitor(this);
- } catch (BreakException var3) {
- if (!var3.isLabeled() || !var3.getLabel().equals(var1.getLabel())) {
- throw var3;
- }
- }
-
- return null;
- }
-
- public Object visit(SynchronizedStatement var1) {
- Object var2 = var1.getLock().acceptVisitor(this);
- synchronized(var2) {
- var1.getBody().acceptVisitor(this);
- return null;
- }
- }
-
- public Object visit(BreakStatement var1) {
- throw new BreakException("unexpected.break", var1.getLabel());
- }
-
- public Object visit(ContinueStatement var1) {
- throw new ContinueException("unexpected.continue", var1.getLabel());
- }
-
- public Object visit(TryStatement var1) {
- boolean var2 = false;
-
- try {
- var1.getTryBlock().acceptVisitor(this);
- } catch (Throwable var13) {
- Object var7 = var13;
- if (var13 instanceof ThrownException) {
- var7 = ((ThrownException)var13).getException();
- } else if (var13 instanceof CatchedExceptionError) {
- var7 = ((CatchedExceptionError)var13).getException();
- }
-
- for(CatchStatement var9 : var1.getCatchStatements()) {
- Class var10 = NodeProperties.getType(var9.getException().getType());
- if (var10.isAssignableFrom(var7.getClass())) {
- var2 = true;
- this.context.enterScope();
- this.context.define(var9.getException().getName(), var7);
- var9.getBlock().acceptVisitor(this);
- break;
- }
- }
-
- if (!var2) {
- if (var13 instanceof Error) {
- throw (Error)var13;
- }
-
- if (var13 instanceof RuntimeException) {
- throw (RuntimeException)var13;
- }
-
- throw new CatchedExceptionError((Exception)var13, var1);
- }
- } finally {
- if (var2) {
- this.context.leaveScope();
- }
-
- Node var6;
- if ((var6 = var1.getFinallyBlock()) != null) {
- var6.acceptVisitor(this);
- }
-
- }
-
- return null;
- }
-
- public Object visit(ThrowStatement var1) {
- throw new ThrownException((Throwable)var1.getExpression().acceptVisitor(this));
- }
-
- public Object visit(ReturnStatement var1) {
- if (var1.getExpression() != null) {
- throw new ReturnException("return.statement", var1.getExpression().acceptVisitor(this), var1);
- } else {
- throw new ReturnException("return.statement", var1);
- }
- }
-
- public Object visit(IfThenStatement var1) {
- if ((Boolean)var1.getCondition().acceptVisitor(this)) {
- var1.getThenStatement().acceptVisitor(this);
- }
-
- return null;
- }
-
- public Object visit(IfThenElseStatement var1) {
- if ((Boolean)var1.getCondition().acceptVisitor(this)) {
- var1.getThenStatement().acceptVisitor(this);
- } else {
- var1.getElseStatement().acceptVisitor(this);
- }
-
- return null;
- }
-
- public Object visit(BlockStatement var1) {
- try {
- Set var5 = (Set)var1.getProperty("variables");
- this.context.enterScope(var5);
- Iterator var6 = var1.getStatements().iterator();
-
- while(var6.hasNext()) {
- ((Node)var6.next()).acceptVisitor(this);
- }
- } finally {
- this.context.leaveScope();
- }
-
- return null;
- }
-
- public Object visit(Literal var1) {
- return var1.getValue();
- }
-
- public Object visit(VariableDeclaration var1) {
- Class var2 = NodeProperties.getType(var1.getType());
- if (var1.getInitializer() != null) {
- Object var3 = performCast(var2, var1.getInitializer().acceptVisitor(this));
- if (var1.isFinal()) {
- this.context.setConstant(var1.getName(), var3);
- } else {
- this.context.set(var1.getName(), var3);
- }
- } else if (var1.isFinal()) {
- this.context.setConstant(var1.getName(), UninitializedObject.INSTANCE);
- } else {
- this.context.set(var1.getName(), UninitializedObject.INSTANCE);
- }
-
- return null;
- }
-
- public Object visit(ObjectFieldAccess var1) {
- Class var2 = NodeProperties.getType(var1.getExpression());
- Object var3 = var1.getExpression().acceptVisitor(this);
- if (!var2.isArray()) {
- Field var4 = (Field)var1.getProperty("field");
-
- try {
- return var4.get(var3);
- } catch (Exception var6) {
- throw new CatchedExceptionError(var6, var1);
- }
- } else {
- return new Integer(Array.getLength(var3));
- }
- }
-
- public Object visit(ObjectMethodCall var1) {
- Expression var2 = var1.getExpression();
- Object var3 = var2.acceptVisitor(this);
- if (var1.hasProperty("method")) {
- Method var13 = (Method)var1.getProperty("method");
- Class[] var14 = var13.getParameterTypes();
- List var15 = var1.getArguments();
- Object[] var16 = Constants.EMPTY_OBJECT_ARRAY;
- if (var15 != null) {
- var16 = new Object[var15.size()];
- Iterator var8 = var15.iterator();
-
- for(int var9 = 0; var8.hasNext(); ++var9) {
- Object var10 = ((Expression)var8.next()).acceptVisitor(this);
- var16[var9] = performCast(var14[var9], var10);
- }
- }
-
- try {
- return var13.invoke(var3, var16);
- } catch (InvocationTargetException var11) {
- if (var11.getTargetException() instanceof Error) {
- throw (Error)var11.getTargetException();
- } else if (var11.getTargetException() instanceof RuntimeException) {
- throw (RuntimeException)var11.getTargetException();
- } else {
- throw new ThrownException(var11.getTargetException());
- }
- } catch (Exception var12) {
- throw new CatchedExceptionError(var12, var1);
- }
- } else {
- Class var4 = NodeProperties.getType(var2);
- int var5 = Array.getLength(var3);
- Object var6 = Array.newInstance(var4.getComponentType(), var5);
-
- for(int var7 = 0; var7 < var5; ++var7) {
- Array.set(var6, var7, Array.get(var3, var7));
- }
-
- return var6;
- }
- }
-
- public Object visit(StaticFieldAccess var1) {
- Field var2 = (Field)var1.getProperty("field");
-
- try {
- return var2.get((Object)null);
- } catch (Exception var4) {
- throw new CatchedExceptionError(var4, var1);
- }
- }
-
- public Object visit(SuperFieldAccess var1) {
- Field var2 = (Field)var1.getProperty("field");
-
- try {
- return var2.get(this.context.getHiddenArgument());
- } catch (Exception var4) {
- throw new CatchedExceptionError(var4, var1);
- }
- }
-
- public Object visit(SuperMethodCall var1) {
- Method var2 = (Method)var1.getProperty("method");
- List var3 = var1.getArguments();
- Object[] var4 = Constants.EMPTY_OBJECT_ARRAY;
- if (var3 != null) {
- Iterator var5 = var3.iterator();
- int var6 = 0;
-
- for(var4 = new Object[var3.size()]; var5.hasNext(); ++var6) {
- var4[var6] = ((Expression)var5.next()).acceptVisitor(this);
- }
- }
-
- try {
- return var2.invoke(this.context.getHiddenArgument(), var4);
- } catch (InvocationTargetException var7) {
- if (var7.getTargetException() instanceof Error) {
- throw (Error)var7.getTargetException();
- } else if (var7.getTargetException() instanceof RuntimeException) {
- throw (RuntimeException)var7.getTargetException();
- } else {
- throw new ThrownException(var7.getTargetException());
- }
- } catch (Exception var8) {
- throw new CatchedExceptionError(var8, var1);
- }
- }
-
- public Object visit(StaticMethodCall var1) {
- Method var2 = (Method)var1.getProperty("method");
- List var3 = var1.getArguments();
- Object[] var4 = Constants.EMPTY_OBJECT_ARRAY;
- if (var3 != null) {
- var4 = new Object[var3.size()];
- Iterator var5 = var3.iterator();
-
- for(int var6 = 0; var5.hasNext(); ++var6) {
- var4[var6] = ((Expression)var5.next()).acceptVisitor(this);
- }
- }
-
- try {
- return var2.invoke((Object)null, var4);
- } catch (InvocationTargetException var7) {
- if (var7.getTargetException() instanceof Error) {
- throw (Error)var7.getTargetException();
- } else if (var7.getTargetException() instanceof RuntimeException) {
- throw (RuntimeException)var7.getTargetException();
- } else {
- throw new ThrownException(var7.getTargetException());
- }
- } catch (Exception var8) {
- throw new CatchedExceptionError(var8, var1);
- }
- }
-
- public Object visit(SimpleAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- var3.prepare(this, this.context);
- Object var4 = var1.getRightExpression().acceptVisitor(this);
- var4 = performCast(NodeProperties.getType(var1), var4);
- var3.modify(this.context, var4);
- return var4;
- }
-
- public Object visit(QualifiedName var1) {
- Object var2 = this.context.get(var1.getRepresentation());
- if (var2 == UninitializedObject.INSTANCE) {
- var1.setProperty("errorStrings", new String[]{var1.getRepresentation()});
- throw new ExecutionError("uninitialized.variable", var1);
- } else {
- return var2;
- }
- }
-
- public Object visit(TypeExpression var1) {
- return var1.getProperty("value");
- }
-
- public Object visit(SimpleAllocation var1) {
- List var2 = var1.getArguments();
- Object[] var3 = Constants.EMPTY_OBJECT_ARRAY;
- if (var2 != null) {
- var3 = new Object[var2.size()];
- Iterator var4 = var2.iterator();
-
- for(int var5 = 0; var4.hasNext(); var3[var5++] = ((Expression)var4.next()).acceptVisitor(this)) {
- }
- }
-
- return this.context.invokeConstructor(var1, var3);
- }
-
- public Object visit(ArrayAllocation var1) {
- if (var1.getInitialization() != null) {
- return var1.getInitialization().acceptVisitor(this);
- } else {
- int[] var2 = new int[var1.getSizes().size()];
- Iterator var3 = var1.getSizes().iterator();
-
- Number var5;
- for(int var4 = 0; var3.hasNext(); var2[var4++] = var5.intValue()) {
- var5 = (Number)((Expression)var3.next()).acceptVisitor(this);
- }
-
- if (var1.getDimension() != var2.length) {
- Class var6 = NodeProperties.getComponentType(var1);
- var6 = Array.newInstance(var6, 0).getClass();
- return Array.newInstance(var6, var2);
- } else {
- return Array.newInstance(NodeProperties.getComponentType(var1), var2);
- }
- }
- }
-
- public Object visit(ArrayInitializer var1) {
- Object var2 = Array.newInstance(NodeProperties.getType(var1.getElementType()), var1.getCells().size());
- Iterator var3 = var1.getCells().iterator();
- int var4 = 0;
-
- while(var3.hasNext()) {
- Object var5 = ((Expression)var3.next()).acceptVisitor(this);
- Array.set(var2, var4++, var5);
- }
-
- return var2;
- }
-
- public Object visit(ArrayAccess var1) {
- Object var2 = var1.getExpression().acceptVisitor(this);
- Object var3 = var1.getCellNumber().acceptVisitor(this);
- if (var3 instanceof Character) {
- var3 = new Integer((Character)var3);
- }
-
- return Array.get(var2, ((Number)var3).intValue());
- }
-
- public Object visit(InnerAllocation var1) {
- Constructor var2 = (Constructor)var1.getProperty("constructor");
- Class var3 = NodeProperties.getType(var1);
- List var4 = var1.getArguments();
- Object var5 = null;
- if (var4 != null) {
- var5 = new Object[var4.size() + 1];
- ((Object[])var5)[0] = var1.getExpression().acceptVisitor(this);
- Iterator var6 = var4.iterator();
-
- for(int var7 = 1; var6.hasNext(); ((Object[])var5)[var7++] = ((Expression)var6.next()).acceptVisitor(this)) {
- }
- } else {
- var5 = new Object[]{var1.getExpression().acceptVisitor(this)};
- }
-
- try {
- return var2.newInstance((Object[])var5);
- } catch (InvocationTargetException var8) {
- if (var8.getTargetException() instanceof Error) {
- throw (Error)var8.getTargetException();
- } else if (var8.getTargetException() instanceof RuntimeException) {
- throw (RuntimeException)var8.getTargetException();
- } else {
- throw new ThrownException(var8.getTargetException());
- }
- } catch (Exception var9) {
- throw new CatchedExceptionError(var9, var1);
- }
- }
-
- public Object visit(ClassAllocation var1) {
- List var2 = var1.getArguments();
- Object[] var3 = Constants.EMPTY_OBJECT_ARRAY;
- if (var2 != null) {
- var3 = new Object[var2.size()];
- Iterator var4 = var2.iterator();
-
- for(int var5 = 0; var4.hasNext(); var3[var5++] = ((Expression)var4.next()).acceptVisitor(this)) {
- }
- }
-
- return this.context.invokeConstructor(var1, var3);
- }
-
- public Object visit(NotExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Boolean var2 = (Boolean)var1.getExpression().acceptVisitor(this);
- return var2 ? Boolean.FALSE : Boolean.TRUE;
- }
- }
-
- public Object visit(ComplementExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Class var2 = NodeProperties.getType(var1);
- Object var3 = var1.getExpression().acceptVisitor(this);
- if (var3 instanceof Character) {
- var3 = new Integer((Character)var3);
- }
-
- return var2 == Integer.TYPE ? new Integer(~((Number)var3).intValue()) : new Long(((Number)var3).longValue() ^ -1L);
- }
- }
-
- public Object visit(PlusExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.plus(NodeProperties.getType(var1), var1.getExpression().acceptVisitor(this));
- }
-
- public Object visit(MinusExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.minus(NodeProperties.getType(var1), var1.getExpression().acceptVisitor(this));
- }
-
- public Object visit(AddExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.add(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(AddAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.add(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(SubtractExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.subtract(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(SubtractAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.subtract(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(MultiplyExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.multiply(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(MultiplyAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.multiply(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(DivideExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.divide(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(DivideAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.divide(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(RemainderExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.remainder(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(RemainderAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.remainder(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(EqualExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Expression var2 = var1.getLeftExpression();
- Expression var3 = var1.getRightExpression();
- return InterpreterUtilities.equalTo(NodeProperties.getType(var2), NodeProperties.getType(var3), ((Node)var2).acceptVisitor(this), ((Node)var3).acceptVisitor(this));
- }
- }
-
- public Object visit(NotEqualExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Expression var2 = var1.getLeftExpression();
- Expression var3 = var1.getRightExpression();
- return InterpreterUtilities.notEqualTo(NodeProperties.getType(var2), NodeProperties.getType(var3), ((Node)var2).acceptVisitor(this), ((Node)var3).acceptVisitor(this));
- }
- }
-
- public Object visit(LessExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Expression var2 = var1.getLeftExpression();
- Expression var3 = var1.getRightExpression();
- return InterpreterUtilities.lessThan(((Node)var2).acceptVisitor(this), ((Node)var3).acceptVisitor(this));
- }
- }
-
- public Object visit(LessOrEqualExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Expression var2 = var1.getLeftExpression();
- Expression var3 = var1.getRightExpression();
- return InterpreterUtilities.lessOrEqual(((Node)var2).acceptVisitor(this), ((Node)var3).acceptVisitor(this));
- }
- }
-
- public Object visit(GreaterExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Expression var2 = var1.getLeftExpression();
- Expression var3 = var1.getRightExpression();
- return InterpreterUtilities.greaterThan(((Node)var2).acceptVisitor(this), ((Node)var3).acceptVisitor(this));
- }
- }
-
- public Object visit(GreaterOrEqualExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Expression var2 = var1.getLeftExpression();
- Expression var3 = var1.getRightExpression();
- return InterpreterUtilities.greaterOrEqual(((Node)var2).acceptVisitor(this), ((Node)var3).acceptVisitor(this));
- }
- }
-
- public Object visit(InstanceOfExpression var1) {
- Object var2 = var1.getExpression().acceptVisitor(this);
- Class var3 = NodeProperties.getType(var1.getReferenceType());
- return var3.isInstance(var2) ? Boolean.TRUE : Boolean.FALSE;
- }
-
- public Object visit(ConditionalExpression var1) {
- if (var1.hasProperty("value")) {
- return var1.getProperty("value");
- } else {
- Boolean var2 = (Boolean)var1.getConditionExpression().acceptVisitor(this);
- return var2 ? var1.getIfTrueExpression().acceptVisitor(this) : var1.getIfFalseExpression().acceptVisitor(this);
- }
- }
-
- public Object visit(PostIncrement var1) {
- Expression var2 = var1.getExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- var3.modify(this.context, InterpreterUtilities.add(NodeProperties.getType(var1), var4, InterpreterUtilities.ONE));
- return var4;
- }
-
- public Object visit(PreIncrement var1) {
- Expression var2 = var1.getExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5;
- var3.modify(this.context, var5 = InterpreterUtilities.add(NodeProperties.getType(var1), var4, InterpreterUtilities.ONE));
- return var5;
- }
-
- public Object visit(PostDecrement var1) {
- Expression var2 = var1.getExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- var3.modify(this.context, InterpreterUtilities.subtract(NodeProperties.getType(var1), var4, InterpreterUtilities.ONE));
- return var4;
- }
-
- public Object visit(PreDecrement var1) {
- Expression var2 = var1.getExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5;
- var3.modify(this.context, var5 = InterpreterUtilities.subtract(NodeProperties.getType(var1), var4, InterpreterUtilities.ONE));
- return var5;
- }
-
- public Object visit(CastExpression var1) {
- return performCast(NodeProperties.getType(var1), var1.getExpression().acceptVisitor(this));
- }
-
- public Object visit(BitAndExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.bitAnd(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(BitAndAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.bitAnd(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- NodeProperties.getModifier(var2).modify(this.context, var5);
- return var5;
- }
-
- public Object visit(ExclusiveOrExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.xOr(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(ExclusiveOrAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.xOr(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(BitOrExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.bitOr(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(BitOrAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.bitOr(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(ShiftLeftExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.shiftLeft(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(ShiftLeftAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.shiftLeft(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(ShiftRightExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.shiftRight(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(ShiftRightAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.shiftRight(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(UnsignedShiftRightExpression var1) {
- return var1.hasProperty("value") ? var1.getProperty("value") : InterpreterUtilities.unsignedShiftRight(NodeProperties.getType(var1), var1.getLeftExpression().acceptVisitor(this), var1.getRightExpression().acceptVisitor(this));
- }
-
- public Object visit(UnsignedShiftRightAssignExpression var1) {
- Expression var2 = var1.getLeftExpression();
- LeftHandSideModifier var3 = NodeProperties.getModifier(var2);
- Object var4 = var3.prepare(this, this.context);
- Object var5 = InterpreterUtilities.unsignedShiftRight(NodeProperties.getType(var1), var4, var1.getRightExpression().acceptVisitor(this));
- var5 = performCast(NodeProperties.getType(var2), var5);
- var3.modify(this.context, var5);
- return var5;
- }
-
- public Object visit(AndExpression var1) {
- Expression var2 = var1.getLeftExpression();
- boolean var3 = (Boolean)var2.acceptVisitor(this);
- if (var3) {
- var2 = var1.getRightExpression();
- var3 = (Boolean)var2.acceptVisitor(this);
- return var3 ? Boolean.TRUE : Boolean.FALSE;
- } else {
- return Boolean.FALSE;
- }
- }
-
- public Object visit(OrExpression var1) {
- Expression var2 = var1.getLeftExpression();
- boolean var3 = (Boolean)var2.acceptVisitor(this);
- if (!var3) {
- var2 = var1.getRightExpression();
- var3 = (Boolean)var2.acceptVisitor(this);
- return var3 ? Boolean.TRUE : Boolean.FALSE;
- } else {
- return Boolean.TRUE;
- }
- }
-
- public Object visit(FunctionCall var1) {
- MethodDeclaration var2 = (MethodDeclaration)var1.getProperty("function");
- GlobalContext var3 = new GlobalContext(this.context.getInterpreter());
- if (var1.getArguments() != null) {
- Iterator var4 = var2.getParameters().iterator();
- Iterator var5 = var1.getArguments().iterator();
-
- while(var4.hasNext()) {
- FormalParameter var6 = (FormalParameter)var4.next();
- if (var6.isFinal()) {
- var3.setConstant(var6.getName(), ((Node)var5.next()).acceptVisitor(this));
- } else {
- var3.setVariable(var6.getName(), ((Node)var5.next()).acceptVisitor(this));
- }
- }
- }
-
- BlockStatement var10 = var2.getBody();
- if (!((Node)var10).hasProperty("visited")) {
- ((Node)var10).setProperty("visited", (Object)null);
- ImportationManager var11 = (ImportationManager)var2.getProperty("importationManager");
- GlobalContext var12 = new GlobalContext(this.context.getInterpreter());
- var12.setImportationManager(var11);
- NameVisitor var7 = new NameVisitor(var12);
- Iterator var8 = var2.getParameters().iterator();
-
- while(var8.hasNext()) {
- ((Node)var8.next()).acceptVisitor(var7);
- }
-
- ((Node)var10).acceptVisitor(var7);
- var12 = new GlobalContext(this.context.getInterpreter());
- var12.setImportationManager(var11);
- var12.setFunctions((List)var2.getProperty("functions"));
- TypeChecker var14 = new TypeChecker(var12);
- var8 = var2.getParameters().iterator();
-
- while(var8.hasNext()) {
- ((Node)var8.next()).acceptVisitor(var14);
- }
-
- ((Node)var10).acceptVisitor(var14);
- }
-
- try {
- ((Node)var10).acceptVisitor(new EvaluationVisitor(var3));
- return null;
- } catch (ReturnException var9) {
- return var9.getValue();
- }
- }
-
- private static Object performCast(Class var0, Object var1) {
- Class var2 = var1 != null ? var1.getClass() : null;
- if (var0 != var2 && var0.isPrimitive() && var2 != null) {
- if (var0 != Character.TYPE && var2 == (class$Ljava$lang$Character != null ? class$Ljava$lang$Character : (class$Ljava$lang$Character = class$("java.lang.Character")))) {
- var1 = new Integer((Character)var1);
- } else if (var0 == Byte.TYPE) {
- var1 = new Byte(((Number)var1).byteValue());
- } else if (var0 == Short.TYPE) {
- var1 = new Short(((Number)var1).shortValue());
- } else if (var0 == Integer.TYPE) {
- var1 = new Integer(((Number)var1).intValue());
- } else if (var0 == Long.TYPE) {
- var1 = new Long(((Number)var1).longValue());
- } else if (var0 == Float.TYPE) {
- var1 = new Float(((Number)var1).floatValue());
- } else if (var0 == Double.TYPE) {
- var1 = new Double(((Number)var1).doubleValue());
- } else if (var0 == Character.TYPE && var2 != (class$Ljava$lang$Character != null ? class$Ljava$lang$Character : (class$Ljava$lang$Character = class$("java.lang.Character")))) {
- var1 = new Character((char)((Number)var1).shortValue());
- }
- }
-
- return var1;
- }
-
- // $FF: synthetic method
- static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
-
- public EvaluationVisitor(Context var1) {
- this.context = var1;
- }
- }
-